<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<div>div</div>
<p>p</p>

<div>div</div>
<span>span</span>

<p>p</p>

<div>div</div>
</body>
<script>
    /*  function select( selector ) {
     var obj = document.querySelectorAll( selector ); // 伪数组

     obj.each = function ( callback ) {
     // 要求遍历 obj, 怎么遍历??? 使用 callback 处理伪数组 obj 中的每一个元素
     each( this, callback );
     // this 是什么, 看谁调用的方法
     };

     return obj;
     }
     function each( arr, callback ) {
     for ( var i = 0; i < arr.length; i++ ) {
     callback( arr[ i ], i );
     }
     }
     //
     select( 'div, p' ).each(function ( v ) {
     v.style.border = '1px dashed blue';
     });
     */
    function each(arr, callback) {
        for (var i = 0; i < arr.length; i++) {
            callback(arr[i], i);
        }
    }
    function select (selector){
        var obj=document.querySelectorAll(selector);
        console.log(obj);
        obj.each= function (callback) {
            each(this, callback);
        };
        return obj;
    }
    select('div,p').each(function (v) {
        v.style.border='1px solid red';
    })


    /*
    * jq:each:数组和对象，跳出循环，返回遍历的对象本身，
    * this还可以是当前元素
    *map:数组和对象  确定是否要返回数据，返回新数组
    * ES5  forEach:只能是数组，不能跳出，
    * 不能用this，不能返回数据等。
    *[对象 函数] 16：52
    * 判断数组：Object.prototype.toString.call(arr)===>'[object Array]'
    * 判断伪数组：1. 必须含有length ‘length’ in arr
    *            2.  判断是不是数字 typeof length=='number'
       *            3.长度非负 length >=0
       *            var length='length' in arr && arr.length;
       *            return typeof length==='number' && length>=0 && length-1in arr;
       *
       * 伪数组：1.必须含有length 2.判断是不是数据 type length=='number';
       * 
    * */
</script>
</html>